package com.wwj.common.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.UUID;

/**
 * jwt工具类
 */
@Slf4j
@Data
public class JWTUtils {

    // 签名
    private String signature;

    /**
     * 创建Token
     * @Param  userId
     * @return Token令牌
     */
    public String createUserToken(String userId) {
        JwtBuilder jwtBuilder = Jwts.builder();
        return jwtBuilder
                // 头部信息
                .setHeaderParam("typ", "JWT")   // 设置类型
                .setHeaderParam("alg", "HS256")  // 设置加密算法
                // 载荷
                .claim("userId", userId)
                // 设置一天的过期时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
                // 设置随机ID
                .setId(UUID.randomUUID().toString())
                // 设置签名
                .signWith(SignatureAlgorithm.HS256, signature)
                // 拼接token
                .compact();
    }

    public String createIdentifyCodeToken(String code) {
        JwtBuilder jwtBuilder = Jwts.builder();
        return jwtBuilder
                // 头部信息
                .setHeaderParam("typ", "JWT")   // 设置类型
                .setHeaderParam("alg", "HS256")  // 设置加密算法
                // 负载
                .claim("code", code)
                // 设置一天的过期时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 20))
                // 设置随机ID
                .setId(UUID.randomUUID().toString())
                // 设置签名
                .signWith(SignatureAlgorithm.HS256, signature)
                // 拼接token
                .compact();
    }


    /**
     * 校验JWT
     * @Param  token
     * @return Token数据
     */
    public Claims parseToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(signature)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            log.error("jwt match error: " + e);
            return null;
        }
    }

    /**
     * 校验过期
     * @Param  expiration
     * @return 布尔是否过期
     */
    public boolean judgeTokenExpiration(Date expiration) {
        return expiration.before(new Date());
    }
}

